package com.serviportales.serviquality.managers;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.liferay.portal.model.User;
import com.liferay.portal.service.UserLocalServiceUtil;
import com.rits.cloning.Cloner;
import com.serviportales.serviportales.model.DataTypesBeans;
import com.serviportales.serviportales.utils.BeansUtils;
import com.serviportales.serviquality.dao.ProyectoUserDAO;
import com.serviportales.serviquality.datatypes.DataTypesRef;
import com.serviportales.serviquality.datatypes.EstadoRegistro;
import com.serviportales.serviquality.exception.ServiqualityException;
import com.serviportales.serviquality.model.Proyecto;
import com.serviportales.serviquality.model.ProyectoUser;

@Service
@Transactional(rollbackFor = { ServiqualityException.class })
public class MgrProyectoUser {

	private Logger logger = Logger.getLogger(getClass());

	@Autowired
	private MessageSource messageSource;
	@Autowired
	private ProyectoUserDAO proyectoUserDAO;

	private void setAttrUserToProyectoUser(ProyectoUser proyectoUser, User user) throws Exception {
		proyectoUser.setFullName(user.getFullName());
		proyectoUser.setLogin(user.getLogin());
		proyectoUser.setEmailAddress(user.getEmailAddress());
		proyectoUser.setScreenName(user.getScreenName());
		proyectoUser.getProyectoUserPK().setUserId(user.getUserId());
	}

	public List<ProyectoUser> buscarUsers(String name, int maxResult) throws ServiqualityException {
		try {
			List<ProyectoUser> usuariosResult = new ArrayList<ProyectoUser>();
			List<User> usuarios = UserLocalServiceUtil.getUsers(0, UserLocalServiceUtil.getUsersCount());

			int cont = 0;
			String upperName = name == null ? "" : name.toUpperCase();
			for (User user : usuarios) {
				if (upperName.isEmpty() || BeansUtils.getDatoAtributo(user, "fullName", "").toUpperCase().indexOf(upperName) >= 0) {
					ProyectoUser proyectoUser = new ProyectoUser();
					setAttrUserToProyectoUser(proyectoUser, user);
					usuariosResult.add(proyectoUser);
					if (cont++ >= maxResult) {
						break;
					}
				}
			}

			return usuariosResult;
		} catch (Exception exception) {
			throw new ServiqualityException(messageSource.getMessage(ServiqualityException.BUSCAR_ERROR, new String[] { exception.getMessage() }, LocaleContextHolder.getLocale()), exception);
		}
	}

	public List<ProyectoUser> buscarProyectoUsers(ProyectoUser proyectoUser) throws ServiqualityException {
		try {
			List<ProyectoUser> lista = proyectoUserDAO.select(proyectoUser);
			for (ProyectoUser prUser : lista) {
				try {
					User user = UserLocalServiceUtil.getUser(prUser.getProyectoUserPK().getUserId());
					if (user != null) {
						setAttrUserToProyectoUser(prUser, user);
					}
				} catch (Exception e) {
					logger.error(e.getMessage(), e);
				}
			}
			return lista;
		} catch (Exception exception) {
			throw new ServiqualityException(messageSource.getMessage(ServiqualityException.BUSCAR_ERROR, new String[] { exception.getMessage() }, LocaleContextHolder.getLocale()), exception);
		}
	}

	public List<ProyectoUser> buscarProyectoUsersByUserActivo(ProyectoUser proyectoUserParam) throws ServiqualityException {
		try {
			ProyectoUser proyectoUser = new Cloner().deepClone(proyectoUserParam);
			EstadoRegistro estadoRegistroActivo = DataTypesBeans.getInstance().getBeanById(EstadoRegistro.class, DataTypesRef.ESTADO_REGISTRO_ACTIVO);
			proyectoUser.setEstadoRegistro(estadoRegistroActivo);
			if (proyectoUser.getProyectoUserPK().getProyecto() == null) {
				proyectoUser.getProyectoUserPK().setProyecto(new Proyecto());
			}
			proyectoUser.getProyectoUserPK().getProyecto().setEstadoRegistro(estadoRegistroActivo);
			return proyectoUserDAO.buscarProyectoUsersByUser(proyectoUser);
		} catch (Exception exception) {
			throw new ServiqualityException(messageSource.getMessage(ServiqualityException.BUSCAR_ERROR, new String[] { exception.getMessage() }, LocaleContextHolder.getLocale()), exception);
		}
	}

	public List<ProyectoUser> buscarProyectoUsersByUser(ProyectoUser proyectoUserParam) throws ServiqualityException {
		try {
			ProyectoUser proyectoUser = new Cloner().deepClone(proyectoUserParam);
			EstadoRegistro estadoRegistroActivo = DataTypesBeans.getInstance().getBeanById(EstadoRegistro.class, DataTypesRef.ESTADO_REGISTRO_ACTIVO);
			proyectoUser.setEstadoRegistro(estadoRegistroActivo);
			return proyectoUserDAO.buscarProyectoUsersByUser(proyectoUser);
		} catch (Exception exception) {
			throw new ServiqualityException(messageSource.getMessage(ServiqualityException.BUSCAR_ERROR, new String[] { exception.getMessage() }, LocaleContextHolder.getLocale()), exception);
		}
	}

	public void grabarProyectoUser(ProyectoUser proyectoUser) throws ServiqualityException {
		try {
			ProyectoUser proyectoUserFilter = proyectoUserDAO.selectByID(proyectoUser.getProyectoUserPK());
			if (proyectoUserFilter != null) {
				proyectoUserFilter.setEstadoRegistro(proyectoUser.getEstadoRegistro());
				proyectoUserDAO.update(proyectoUserFilter);
			} else {
				proyectoUserDAO.insert(proyectoUser);
			}
		} catch (Exception exception) {
			throw new ServiqualityException(messageSource.getMessage(ServiqualityException.GRABAR_ERROR, new String[] { exception.getMessage() }, LocaleContextHolder.getLocale()), exception);
		}
	}
}
